home *** CD-ROM | disk | FTP | other *** search
- REM $TITLE: 'SMALLEXE'
-
- REM $INCLUDE: 'C:\QBASIC\QB.BI'
-
- DEFINT A-Z
-
- ' Common variables
-
- COMMON SHARED INPREG AS REGTYPE
- COMMON SHARED OUTREG AS REGTYPE
- COMMON SHARED CRLF$
-
- ' Subprograms
-
- DECLARE SUB InputLine (BUFFER$, OFFSET, LINE$)
-
- ' Functions
-
- DECLARE FUNCTION ReadData$ (DATA$)
- DECLARE FUNCTION ReadTimer& ()
- DECLARE FUNCTION StrToInt& (NUMSTR$)
-
- Initialize:
-
- DATA$ = "1,2,3,4,5,6,7,8,9,10"
- DATA$ = DATA$ + ",Now,is,the,time,for,all,good,persons,to,come"
-
- CHAN = 1 ' I/O channel
-
- CRLF$ = CHR$(13) + CHR$(10)
-
- StartProgram:
-
- PRINT : PRINT "Integers"
- START& = ReadTimer&
- FOR I = 1 TO 10
- PRINT I, StrToInt&(ReadData$(DATA$))
- NEXT I
- PRINT "Ticks = "; ReadTimer& - START&
-
- PRINT : PRINT "Strings"
- START& = ReadTimer&
- FOR I = 11 TO 20
- PRINT I, ReadData$(DATA$)
- NEXT I
- PRINT "Ticks = "; ReadTimer& - START&
-
- PRINT : PRINT "Read ASCII file:"
- OPEN "SMALLEXE.BAS" FOR BINARY AS #CHAN
- FILESIZE = LOF(CHAN)
- BUFFER$ = STRING$(FILESIZE, 0)
- GET #CHAN, , BUFFER$
- IF RIGHT$(BUFFER$, 2) <> CRLF$ THEN
- BUFFER$ = BUFFER$ + CRLF$
- END IF
-
- FILEOFFS = 1
- DO UNTIL FILEOFFS > FILESIZE
- CALL InputLine(BUFFER$, FILEOFFS, LINE$)
- PRINT LINE$
- LOOP
-
- CLOSE #CHAN
- BUFFER$ = ""
-
- EndProgram:
-
- END
-
- REM $PAGE
-
- '[]=============================================================[]
- '[] Returns one CRLF$ delimited line of text from []
- '[] the specified buffer []
- '[]=============================================================[]
-
- SUB InputLine (BUFFER$, OFFSET, LINE$) STATIC
-
- ' Obviously you can't GET a large file all at one time; modify
- ' routines to deal with a bufferfull at a time
-
- IF OFFSET > LEN(BUFFER$) THEN
- LINE$ = NULL$
- EXIT SUB
- END IF
-
- ' Extract the line
-
- STRPOS = INSTR(OFFSET, BUFFER$, CRLF$)
- LINE$ = MID$(BUFFER$, OFFSET, STRPOS - OFFSET)
-
- ' Point to the start of the next line
-
- OFFSET = STRPOS + 2
-
- END SUB
-
- '[]=============================================================[]
- '[] Returns one string from DATA$; works sequentially only []
- '[]=============================================================[]
-
- FUNCTION ReadData$ (DATA$) STATIC
-
- STATIC COUNT ' Number of times called
- STATIC START ' Starting pos in string
-
- COUNT = COUNT + 1
- IF COUNT = 1 THEN
- START = 1
- END IF
-
- WORK$ = ""
- FOR INDX = START TO LEN(DATA$)
- CHAR$ = MID$(DATA$, INDX, 1)
- IF CHAR$ = "," THEN
- EXIT FOR
- END IF
- WORK$ = WORK$ + CHAR$
- NEXT INDX
- START = INDX + 1
-
- ReadData$ = WORK$
-
- END FUNCTION
-
- '[]=============================================================[]
- '[] Returns longword clock ticks using DOS Interrupt []
- '[]=============================================================[]
-
- FUNCTION ReadTimer& STATIC
-
- INPREG.AX = &H0000
- CALL INTERRUPT(&H1A, INPREG, OUTREG)
-
- IF OUTREG.DX < 0 THEN
- LO& = 65536 + OUTREG.DX ' Adjust for signed word
- ELSE
- LO& = OUTREG.DX
- END IF
-
- TICKS& = (65536 * OUTREG.CX) + LO&
-
- ReadTimer& = TICKS&
-
- END FUNCTION
-
- '[]=============================================================[]
- '[] Converts string to a long integer []
- '[]=============================================================[]
-
- FUNCTION StrToInt& (NUMSTR$) STATIC
-
- IF LEFT$(NUMSTR$, 1) = "-" THEN
- NEGATIVE = TRUE
- WORK$ = RIGHT$(NUMSTR$, LEN(NUMSTR$) - 1)
- ELSE
- NEGATIVE = FALSE
- WORK$ = NUMSTR$
- END IF
-
- VALUE& = 0: POWER& = 1
-
- FOR INDX = LEN(WORK$) TO 1 STEP -1
- BYTE$ = MID$(WORK$, INDX, 1)
- IF (BYTE$ < "0" OR BYTE$ > "9") THEN
- EXIT FOR
- ELSE
- VALUE& = VALUE& + (POWER& * (ASC(BYTE$) - 48))
- POWER& = 10 * POWER&
- END IF
- NEXT INDX
-
- IF NEGATIVE THEN
- StrToInt& = -VALUE&
- ELSE
- StrToInt& = VALUE&
- END IF
-
- END FUNCTION
-